有了 NavController ,可以調用 navigate() 在各個目的地之間導航 ,可每個reload支援多種導航場景。
取得 NavController 有三種方式:
Fragment.findNavController()
View.findNavController()
Activity.findNavController(viewId: Int)
val action = SpecifyAmountFragmentDirections
.actionSpecifyAmountFragmentToConfirmationFragment(amount)
v.findNavController().navigate(action)
返回上一頁 back / pop page
NavController navigateUp() 和 popBackStack() 都可以返回上一頁,差別為:
popBackStack() 如果當前的返回如上一頁是空的就會error,navigateUp() 則不會,還是停留在當前頁面
class aFragment : Fragment() {
//...
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//...
binding.btn1Fragment.addClickAction {
Navigation.findNavController(view).popBackStack(R.id.aFragment, false)
}
}
}
動手作
實作情境為:點新增跳出輸入畫面,輸入完成後回到上一頁
使用 Safe Args 的 Gradle libary,提供 object 和 builder 用於導航和數據傳遞。
Safe Args 產生 TodoListFragmentDirections class
Safe Args 會生成一個 TodoListFragmentDirections class,其中只包含一個 actionSpecifyAmountFragmentToConfirmationFragment() func 。 NavDirections 並存儲了關聯的操作 ID 和 float 可以將返回的 NavDirections 對象直接傳遞到 navigate()。
class TodoListFragmentDirections private constructor() {
companion object {
fun actionMainFragmentToAddTodoFragment(): NavDirections =
ActionOnlyNavDirections(R.id.actionMainFragmentToAddTodoFragment)
}
}
使用 Safe Args , buttonAdd click 時,跳轉到actionMainFragmentToAddTodoFragment
class TodoListFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_todo_list, container, false)
}
.................
buttonAdd.setOnClickListener {
findNavController().navigate(TodoListFragmentDirections.actionMainFragmentToAddTodoFragment())
}
}
}
輸入完成後,回上一頁
buttonAdd.setOnClickListener {
if (editTodo.text.isNullOrEmpty()) {
editTodo.error = "請輸入你的代辦事項"
} else {
......
// back to list page
findNavController().popBackStack()
}
}
reference:
https://developer.android.com/guide/navigation/navigation-navigate
reference:https://www.jianshu.com/p/729375b932fe
reference:https://www.notion.so/Navigation-component-9-9-Andy-a1245a1b31c5453fbf1b28f887ec0d73